# -*- coding : utf_8 -*-
"""
=======================================
Time : 2025/4/15 20:35
Author : 田霄汉
Email : 522989570@qq.com
File : combat_class21.py
Project : pandas_demo
Function : 根据散点图绘制趋势线,进行预测
=======================================
"""
import pandas as pd
from pandas import DataFrame
from config.setting import file_path
import matplotlib.pyplot as plt
from scipy.stats import linregress

combat21_path = file_path['excel_path']+'/combat21.xlsx'

pd.options.display.max_columns = 999
Revenue: DataFrame = pd.read_excel(io=combat21_path,
                                   skiprows=3,
                                   usecols='C:D',
                                   dtype={'Date': str})  # 将Date设置成str格式

# linregress是线性回归方程,slope是斜率,intercept是截距
slope, intercept, r, p, std_err = linregress(Revenue.index, Revenue.Revenue)

# 根据slope和intercept写出预期公式
exp = slope * Revenue.index + intercept
# 画出折线图
plt.plot(Revenue.index, exp, color='red')

# 显示散点图,为什么使用这种方式:就是为了能让柱状图和曲线图能在一张图片上
# 只有x轴都使用index才可以显示到一张图片上
plt.scatter(x=Revenue.index, y=Revenue.Revenue)
plt.xticks(ticks=Revenue.index, labels=Revenue.Date, rotation=90)
# plt.scatter(x=Revenue.Date, y=Revenue.Revenue)

# # 显示柱形图的第一种方式
# Revenue.plot.bar(x='Date', y='Revenue')
# # 显示柱形图的第二种方式,为什么使用这种方式:就是为了能让柱状图和曲线图能在一张图片上
# plt.bar(x=Revenue.index, height=Revenue.Revenue)
# plt.xticks(ticks=Revenue.index, labels=Revenue.Date, rotation=90)
# # 显示柱形图的第三种方式
# plt.bar(x=Revenue.Date, height=Revenue.Revenue)
# plt.xticks(rotation=90)

# 在标题上打印出来一元线性回归方程
plt.title(label=f'y={slope}*x+{intercept}', fontsize=12, fontweight='bold')
plt.xlabel(xlabel='DATE', fontsize=16, fontweight='bold')
plt.ylabel(ylabel='REVENUE', fontsize=16, fontweight='bold')

plt.tight_layout()
plt.show()
